<?php

declare(strict_types=1);

namespace App\Service\ObjectStorage;

use App\Utils\Helper\GeneralHelper;

/**
 * 存储对象上传服务基类
 * Class ObjectStorageService
 * @package App\Service\ObjectStorage
 */
class ObjectStorageService {
    /**
     * 校验上传文件
     * @param $file
     * @param $file_path
     * @param string[] $allow_type
     * @param int $max_size
     * @return FileStruct
     * @throws \Exception
     */
    public function verifyFile ($file, $file_path, $allow_type = ['jpg', 'png', 'jpeg'], $max_size = 1048576) {
        $file_struct = new FileStruct();

        if (!$file) {
            exception('未上传文件');
        }

        // 参数整理
        $file_name = $file['name'] ?? '';
        $file_size = $file['size'] ?? 0;
        $file_error = $file['error'] ?? 99999;
        $file_tmp_name = $file['tmp_name'] ?? '';
        $file_ext = GeneralHelper::getInstance()->getFileExtension($file_name);
        $new_file_name = GeneralHelper::getInstance()->getUniqueName().'.'.$file_ext;

        // 检查文件是否上传成功
        switch ($file_error) {
            case '1':
                exception('超过php.ini允许的大小');
                break;
            case '2':
                exception('超过表单允许的大小');
                break;
            case '3':
                exception('只有部分被上传');
                break;
            case '4':
                exception('未上传文件');
                break;
            case '6':
                exception('找不到临时目录');
                break;
            case '7':
                exception('写文件到硬盘出错');
                break;
            case '8':
                exception('File upload stopped by extension');
                break;
        }
        if (@is_uploaded_file($file_tmp_name) === false) {
            exception('上传失败');
        }
        // 检查文件大小
        if ($file_size > $max_size) {
            exception('上传文件大小超过限制，允许的大小为'.GeneralHelper::getInstance()->fileConvertUnit($max_size));
        }
        // 检查扩展名
        if (in_array($file_ext, $allow_type) === false) {
            exception('上传文件不是允许的扩展，只允许 '.implode(',', $allow_type).' 格式');
        }

        $file_struct->setNewFilePath($file_path.$new_file_name);
        $file_struct->setFileTmpName($file_tmp_name);

        return $file_struct;
    }
}